}
static GdkWindow *
-gdk_event_source_get_filter_window (GdkEventSource *event_source,
- XEvent *xevent)
+gdk_event_source_get_filter_window (GdkEventSource *event_source,
+ XEvent *xevent,
+ GdkEventTranslator **event_translator)
{
+ GList *list = event_source->translators;
GdkWindow *window;
+ *event_translator = NULL;
+
+ while (list)
+ {
+ GdkEventTranslator *translator = list->data;
+
+ list = list->next;
+ window = _gdk_x11_event_translator_get_window (translator,
+ event_source->display,
+ xevent);
+ if (window)
+ {
+ *event_translator = translator;
+ return window;
+ }
+ }
+
window = gdk_x11_window_lookup_for_display (event_source->display,
xevent->xany.window);
XEvent *xevent)
{
GdkEvent *event = gdk_event_new (GDK_NOTHING);
- GList *list = event_source->translators;
GdkFilterReturn result = GDK_FILTER_CONTINUE;
+ GdkEventTranslator *event_translator;
GdkWindow *filter_window;
Display *dpy;
if (xevent->type == GenericEvent)
XGetEventData (dpy, &xevent->xcookie);
- filter_window = gdk_event_source_get_filter_window (event_source, xevent);
+ filter_window = gdk_event_source_get_filter_window (event_source, xevent,
+ &event_translator);
if (filter_window)
event->any.window = g_object_ref (filter_window);
gdk_event_free (event);
event = NULL;
- while (list && !event)
+ if (event_translator)
{
- GdkEventTranslator *translator = list->data;
-
- list = list->next;
- event = _gdk_x11_event_translator_translate (translator,
+ /* Event translator was gotten before in get_filter_window() */
+ event = _gdk_x11_event_translator_translate (event_translator,
event_source->display,
xevent);
}
+ else
+ {
+ GList *list = event_source->translators;
+
+ while (list && !event)
+ {
+ GdkEventTranslator *translator = list->data;
+
+ list = list->next;
+ event = _gdk_x11_event_translator_translate (translator,
+ event_source->display,
+ xevent);
+ }
+ }
if (event &&
(event->type == GDK_ENTER_NOTIFY ||
#include "config.h"
#include "gdkeventtranslator.h"
-
+#include "gdkwindow-x11.h"
typedef GdkEventTranslatorIface GdkEventTranslatorInterface;
G_DEFINE_INTERFACE (GdkEventTranslator, _gdk_x11_event_translator, G_TYPE_OBJECT);
if (iface->select_window_events)
iface->select_window_events (translator, window, event_mask);
}
+
+GdkWindow *
+_gdk_x11_event_translator_get_window (GdkEventTranslator *translator,
+ GdkDisplay *display,
+ XEvent *xevent)
+{
+ GdkEventTranslatorIface *iface;
+ GdkWindow *window = NULL;
+
+ g_return_val_if_fail (GDK_IS_EVENT_TRANSLATOR (translator), NULL);
+
+ iface = GDK_EVENT_TRANSLATOR_GET_IFACE (translator);
+
+ if (iface->get_window)
+ window = iface->get_window (translator, xevent);
+
+ if (!window)
+ window = gdk_x11_window_lookup_for_display (display, xevent->xany.window);
+
+ return window;
+}
void (* select_window_events) (GdkEventTranslator *translator,
Window window,
GdkEventMask event_mask);
+ GdkWindow * (* get_window) (GdkEventTranslator *translator,
+ XEvent *xevent);
};
GType _gdk_x11_event_translator_get_type (void) G_GNUC_CONST;
void _gdk_x11_event_translator_select_window_events (GdkEventTranslator *translator,
Window window,
GdkEventMask event_mask);
+GdkWindow * _gdk_x11_event_translator_get_window (GdkEventTranslator *translator,
+ GdkDisplay *display,
+ XEvent *xevent);
G_END_DECLS